public class Main {
    public static void main(String[] args) {
        System.out.println("Hello world!");

        // 进程

        // **** 进程调度 ****

        //一、pid
        //二、内存指针
        //三、文件描述符表
        //四、进程调度相关的属性
        // 进程的状态 ：
        //  1.就绪状态
        //  2.执行状态
        //  3.阻塞状态
        // 优先级
        // 上下文
        // 记账信息

        // 进程的主要目的就是为了解决“并发编程”这样的问题
        //进程控制块PCB（Progress Control Block）;

        // PCB 都有哪些特性


        // 内存管理
        // 虚拟地址空间 ~~（程序中所获取到的内存地址，并非是真实的物理内存地址，而是经过了一层抽象，虚拟出来的地址）.
        // （解释：用专门的硬件设备负责进行虚拟地址到物理地址的转换）
        // 主要解决的问题就是防止 进程之间相互产生影响
        // （一个进程出问题就不会影响到其他进程）
        // 这时候虽然进程隔离了，但又引入了新的问题
        // 有些时候，确实进程之间，需要进行数据的交互（相互配合）‘
        // 这就有了 进程间的通信
        // 实现方式 ： 需要搞一个多个进程都能访问到的“公共空间”，基于这个空间来进行交互数据即可。
        // 这里的通信方式/公共空间 有很多种具体的体现形式
        // 但是在开发中最常用的是：基于文件的形式  和 基于网络的形式

        // **** 多线程 ****
        //  线程也叫做“轻量级进程"
        // 解决并发编程问题的前提下，让创建，销毁，调度的速度更快一些
        // 而 一个进程太重了（重就重在资源分配和回收上）， 创建一个进程，销毁一个进程，调度一个进程的开销都比较大

        // 线程为啥更”轻“ ，因为 是把 申请资源/释放资源的操作给节省下了

        // 线程和进程的关系 是 进程 包含 线程
        // 一个进程里面可以包含一个线程，也可以包含多个线程（但是不能没有）  【只有第一个线程启动的时候，开销是比较大的，后续线程就省事了】
        //  同一个进程里的多个线程之间，共用了进程的同一份资源（主要指的是 内存 和 文件描述表）
        //        内存在代码中指的是 你创建的对象 你在线程1里面 new的对象 在线程 2，3，4里面都可以直接用
        //         文件描述就是指 在线程1里面打开的文件在线程2，3，4里面都可以直接用
        // 操作系统，实际调度的时候是以线程为单位进行调度
        // （进程调度，是在进程当中只有一个线程这样的情况，如果每个进程有多个线程了，每个线程都是独立在cpu上调度的 =》 线程是操作系统调度执行的基本单位）
        // 每个线程也都有自己的执行逻辑


        // 同时一个线程也是通过一个pcb来描述的
        // 一个进程里面可能是对应一个PCB也可能是多个
        // PCB里面的状态，上下文，优先级，记账信息，都是每个线程有自己的，各自记录各自的
        // 但是同一个进程里面的PCB之间，pid是一样的，内存指针和文件描述符表也是一样的

        // 谈到”调度“ 已经和线程没有什么关系了，进程专门负责资源分配
        // 线程来接管和调度相关的一切内容
        // 上面所讲到的进程调度的过程，和当前线程调度是完全一致的

        // 但是也有一个问题：
        // 就是当我们增加线程数量的时候，也不是可以一直提高速度！；
        // 桌子的空间是有限的（和cpu核心数量是有限的）
        // 线程太多，核心数目有限，不小的开销反而浪费在线程调度上

        // 而且 在多线程当中也会出现一种情况：那就是出现 多个线程同时需要同一个资源的事情 （这就是线程安全问题）
        // 而 在多进程当中则不会出现这样的问题，因为多进程当中的资源都是独立的

        // 还有一种情况：那就是一个线程抛异常，如果处理不好，很有可能把整个进程都带走
        // 此时其他线程也就挂了

        // java圈子中遇到的多线程的情况也要比多进程很多很多


        // 接下来就开始看多线程编程在Java中如何体现

        // 本身关于线程的操作，操作系统提供的API
        // Java是个快平台的语言，很多操作系统的提供的功能，都被JVM封装好了
        // 咱们不需要学习 系统原生的API（C语言），只需要学习Java提供的API就行了

         // 就是 随便一个系统实现了对应版本的JVM ， 跨平台就是靠着无数个不同版本的JVM支持的
        // 这些不同的JVM 内部封装了
        // 不同系统的API ， 对不同的平台都是执行同样的规则的字节码

        // Java操作多线程，最核心的类是Thread(必须会读)


    }
}